Setup

Data preparation

Topic modeling

Adults, 7-point scale

# make wideframe df
d1b_prep <- d1b %>%
  select(subid, age, character, capacity, responseNum) %>%
  mutate(age = as.numeric(as.character(age))) %>%
  spread(capacity, responseNum) %>%
  arrange(age) %>%
  remove_rownames() %>%
  column_to_rownames("subid")
# limit to complete cases for tsne
d1b_all_complete <- d1b_prep[complete.cases(d1b_prep),]
# make LDA-friendly df
d1b_LDA <- d1b_all_complete %>%
  rownames_to_column("subid") %>%
  select(-age, -character) %>%
  gather(capacity, response, -subid) %>%
  mutate(response = ifelse(response > 0, 1, response)) # legit?
  # mutate(response = (response * 2)) # is this legit? not counts...
d1b_LDA_keep <- d1b_LDA %>%
  ungroup() %>%
  group_by(subid) %>%
  summarise(sum = sum(response, na.rm = T)) %>%
  filter(sum != 0) %>%
  mutate(subid = as.character(subid))
  
d1b_LDA <- d1b_LDA %>%
  filter(subid %in% d1b_LDA_keep$subid) %>%
  ungroup() %>%
  spread(capacity, response) %>%
  remove_rownames() %>%
  column_to_rownames("subid")
# do LDA
d1b_LDA <- LDA(x = d1b_LDA, k = 10)
# look at terms by topic
d1b_LDA_topics <- tidy(d1b_LDA, matrix = "beta")
d1b_LDA_termorder <- d1b_LDA_topics %>%
  group_by(term) %>%
  top_n(1, beta) %>%
  arrange(topic, desc(beta)) %>%
  data.frame() %>%
  rownames_to_column("order") %>%
  mutate(order = as.numeric(as.character(order)))
ggplot(d1b_LDA_topics %>%
         full_join(d1b_LDA_termorder %>% select(term, order)) %>%
         distinct(),
       aes(x = topic, y = reorder(term, desc(order)), fill = beta)) +
  geom_tile() +
  scale_fill_distiller(palette = "YlGn", direction = 1,
                       guide = guide_colorbar(title = element_blank(),
                                              barheight = 10)) +
  theme_minimal()
Joining, by = "term"

# look at topics by "document" (participant)
d1b_LDA_documents <- tidy(d1b_LDA, matrix = "gamma") %>%
  rename(subid = document)
d1b_LDA_docorder <- d1b_LDA_documents %>%
  group_by(subid) %>%
  top_n(1, gamma) %>%
  arrange(topic, desc(gamma)) %>%
  data.frame() %>%
  rownames_to_column("order") %>%
  mutate(order = as.numeric(as.character(order))) %>%
  full_join(d1b_all_complete %>% 
              rownames_to_column("subid") %>% 
              select(subid, age, character))
Joining, by = "subid"
# ggplot(d1b_LDA_documents %>%
#          full_join(d1b_LDA_docorder %>% select(subid, order)),
#        aes(x = topic, y = reorder(subid, desc(order)), fill = gamma)) +
#   geom_tile() +
#   scale_fill_distiller(palette = "RdYlBu", 
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 10)) +
#   theme_minimal()
ggplot(d1b_LDA_documents %>% 
         full_join(d1b_LDA_docorder) %>% 
         filter(!is.na(character), !is.na(topic)) %>%
         distinct(),
       aes(x = age, y = gamma, color = factor(topic))) +
  # facet_wrap(~ topic) +
  facet_grid(character ~ topic) +
  geom_point() +
  # geom_smooth(method = "lm") +
  theme_bw()
Joining, by = c("subid", "topic", "gamma")

4-10yo

# make LDA-friendly df
d_slide_LDA <- d_slide_all_complete %>%
  rownames_to_column("subid") %>%
  select(-age, -character) %>%
  gather(capacity, response, -subid) %>%
  mutate(response = ifelse(response > 0, 1, response)) # legit?
  # mutate(response = (response * 2)) # is this legit? not counts...
d_slide_LDA_keep <- d_slide_LDA %>%
  ungroup() %>%
  group_by(subid) %>%
  summarise(sum = sum(response, na.rm = T)) %>%
  filter(sum != 0) %>%
  mutate(subid = as.character(subid))
  
d_slide_LDA <- d_slide_LDA %>%
  filter(subid %in% d_slide_LDA_keep$subid) %>%
  ungroup() %>%
  spread(capacity, response) %>%
  remove_rownames() %>%
  column_to_rownames("subid")
# do LDA
d_slide_LDA <- LDA(x = d_slide_LDA, k = 3)
# look at terms by topic
d_slide_LDA_topics <- tidy(d_slide_LDA, matrix = "beta")
d_slide_LDA_termorder <- d_slide_LDA_topics %>%
  group_by(term) %>%
  top_n(1, beta) %>%
  arrange(topic, desc(beta)) %>%
  data.frame() %>%
  rownames_to_column("order") %>%
  mutate(order = as.numeric(as.character(order)))
ggplot(d_slide_LDA_topics %>%
         full_join(d_slide_LDA_termorder %>% select(term, order)) %>%
         distinct(),
       aes(x = topic, y = reorder(term, desc(order)), fill = beta)) +
  geom_tile() +
  scale_fill_distiller(palette = "YlGn", direction = 1,
                       guide = guide_colorbar(title = element_blank(),
                                              barheight = 10)) +
  scale_x_continuous(breaks = 1:10) +
  theme_minimal()
Joining, by = "term"

# look at topics by "document" (participant)
d_slide_LDA_documents <- tidy(d_slide_LDA, matrix = "gamma") %>%
  rename(subid = document)
d_slide_LDA_docorder <- d_slide_LDA_documents %>%
  group_by(subid) %>%
  top_n(1, gamma) %>%
  arrange(topic, desc(gamma)) %>%
  data.frame() %>%
  rownames_to_column("order") %>%
  mutate(order = as.numeric(as.character(order))) %>%
  full_join(d_slide_all_complete %>% 
              rownames_to_column("subid") %>% 
              select(subid, age, character))
Joining, by = "subid"
# ggplot(d_slide_LDA_documents %>%
#          full_join(d_slide_LDA_docorder %>% select(subid, order)),
#        aes(x = topic, y = reorder(subid, desc(order)), fill = gamma)) +
#   geom_tile() +
#   scale_fill_distiller(palette = "RdYlBu", 
#                        guide = guide_colorbar(title = element_blank(),
#                                               barheight = 10)) +
#   theme_minimal()
ggplot(d_slide_LDA_documents %>% 
         full_join(d_slide_LDA_docorder %>% select(subid, character, age)) %>% 
         filter(!is.na(character), !is.na(topic)) %>%
         distinct(),
       aes(x = age, y = gamma, 
           # color = character, fill = character)) +
           color = factor(topic), fill = factor(topic))) +
  # facet_grid(~ topic) +
  facet_grid(character ~ topic) +
  geom_point() +
  geom_smooth(method = "lm") +
  theme_bw()
Joining, by = "subid"

library(plotly)
plot_ly(d_slide_LDA_documents %>%
          mutate(topic = recode(topic,
                                "1" = "topic_1",
                                "2" = "topic_2",
                                "3" = "topic_3")) %>%
          spread(topic, gamma) %>%
          full_join(d_slide_LDA_docorder %>% 
                      select(subid, age, character)) %>%
          filter(!is.na(character)),
        x = ~topic_1, y = ~topic_2, z = ~topic_3,
        color = ~age,
        # color = ~character,
        # size = ~age,
        opacity = 0.6)
Joining, by = "subid"
No trace type specified:
  Based on info supplied, a 'scatter3d' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#scatter3d
No scatter3d mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
Ignoring 16 observationsNo trace type specified:
  Based on info supplied, a 'scatter3d' trace seems appropriate.
  Read more about this trace type -> https://plot.ly/r/reference/#scatter3d
No scatter3d mode specifed:
  Setting the mode to markers
  Read more about this attribute -> https://plot.ly/r/reference/#scatter-mode
Ignoring 16 observations
LS0tCnRpdGxlOiAiRGlta2lkOiBUb3BpYyBNb2RlbGluZyAoTERBKSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpCmBgYAoKIyBTZXR1cAoKYGBge3Igc2V0dXAsIGluY2x1ZGUgPSBGfQojIGxvYWQgbGlicmFyaWVzCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KGxhbmdjb2cpICMgc291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vbGFuZ2NvZy9sYW5nY29nCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KHBsb3RseSkKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkocm1zKQpsaWJyYXJ5KHRvcGljbW9kZWxzKQpsaWJyYXJ5KHRpZHl0ZXh0KQpgYGAKCmBgYHtyIGZ1bmN0aW9ucywgaW5jbHVkZSA9IEZ9CiMgbWFrZSByb3VuZGluZyBmdW5jdGlvbgpyb3VuZDIgPC0gZnVuY3Rpb24oeCkge2Zvcm1hdChyb3VuZCh4LCAyKSwgbnNtYWxsID0gMil9CgojIG1ha2UgY2xlYW51cCBmdW5jdGlvbgpjbGVhbnVwIDwtIGZ1bmN0aW9uKGRhdGFzb3VyY2UsIGFnZV9ncm91cCkgewogIGlmKGdyZXBsKCJhZHVsdCIsIGFnZV9ncm91cCkpIHsKICAgIAogICAgIyBzZXQgdGFyZ2V0IGRhdGFzZXQKICAgIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDEiKXtkIDwtIGRfcmF3X3N0dWR5MX0KICAgIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFiIil7ZCA8LSBkX3Jhd19zdHVkeTFifQogICAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMWMiKXtkIDwtIGRfcmF3X3N0dWR5MWN9CiAgICAKICAgICMgZW5hY3QgZXhjbHVzaW9uYXJ5IGNyaXRlcmlhCiAgICBkX2NsZWFuXzEgPC0gZAogICAgCiAgICAjIHJlY29kZSBiYWNrZ3JvdW5kIGFuZCBkZW1vZ3JhcGhpYyB2YXJpYWJsZXMKICAgIGRfY2xlYW4gPC0gZF9jbGVhbl8xICU+JQogICAgICBtdXRhdGUoICMgZGVhbCB3aXRoIHN0dWR5IG51bWJlcgogICAgICAgIHN0dWR5ID0gZmFjdG9yKHN0dWR5KSkgJT4lCiAgICAgIG11dGF0ZSggIyBkZWFsIHdpdGggcmFjZQogICAgICAgIHJhY2VfY2F0MiA9IGZhY3RvcihzdWIoIiArJCIsICIiLCBldGhuaWNpdHkpKSwKICAgICAgICByYWNlX2NhdDMgPSBmYWN0b3IoaWZlbHNlKGdyZXBsKCIgIiwgcmFjZV9jYXQyKSA9PSBULCAibXVsdGlyYWNpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKHJhY2VfY2F0MikpKSkgJT4lCiAgICAgIGRwbHlyOjpzZWxlY3Qoc3R1ZHksIHN1YmlkOmNvdW50cnlfc2VsZnJlcCwgYWdlX2dyb3VwLCByYWNlX2NhdDMpICU+JQogICAgICByZW5hbWUocmFjZV9jYXQgPSByYWNlX2NhdDMpICU+JQogICAgICBtdXRhdGUoICMgZGVhbCB3aXRoIHJlbGlnaW9uIChub3RlOiBvbmx5IGRlYWxpbmcgd2l0aCBjaGlsZGhvb2QgcmVsaWdpb24gZm9yIG5vdykKICAgICAgICByZWxpZ2lvbl9jYXQyID0gZmFjdG9yKHN1YigiICskIiwgIiIsIHJlbGlnaW9uQ2hpbGQpKSwKICAgICAgICByZWxpZ2lvbl9jYXQzID0gZmFjdG9yKGlmZWxzZShncmVwbCgiICIsIHJlbGlnaW9uX2NhdDIpID09IFQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdWx0aXJlbGlnaW91cyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKHJlbGlnaW9uX2NhdDIpKSkpICU+JQogICAgICBkcGx5cjo6c2VsZWN0KHN0dWR5OnJhY2VfY2F0LCByZWxpZ2lvbl9jYXQzKSAlPiUKICAgICAgcmVuYW1lKHJlbGlnaW9uX2NhdCA9IHJlbGlnaW9uX2NhdDMpCiAgICAKICAgICMgcmVtb3ZlIGV4dHJhbmVvdXMgZGZzIGFuZCB2YXJpYWJsZXMKICAgIHJtKGQsIGRfY2xlYW5fMSkKICB9CiAgCiAgaWYoZ3JlcGwoImNoaWxkIiwgYWdlX2dyb3VwKSkgewogICAgCiAgICAjIHNldCB0YXJnZXQgZGF0YXNldAogICAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMiIpe2QgPC0gZF9yYXdfc3R1ZHkyfQogICAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMyIpe2QgPC0gZF9yYXdfc3R1ZHkzfQogICAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgNCIpe2QgPC0gZF9yYXdfc3R1ZHk0fQogICAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgNSIpe2QgPC0gZF9yYXdfc3R1ZHk1fQogICAgCiAgICAjIHJlY29kZSBiYWNrZ3JvdW5kIGFuZCBkZW1vZ3JhcGhpYyB2YXJpYWJsZXMKICAgIGRfY2xlYW5fMiA8LSBkICU+JQogICAgICBtdXRhdGUoICMgZGVhbCB3aXRoIHN0dWR5IG51bWJlcgogICAgICAgIHN0dWR5ID0gZmFjdG9yKHN0dWR5KSwKICAgICAgICByZXNwb25zZU51bSA9IGlmZWxzZSghaXMubmEocmVzcG9uc2VOdW0pLCByZXNwb25zZU51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocmVzcG9uc2UgPT0gIm5vIiwgMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShyZXNwb25zZSA9PSAia2luZGEiLCAwLjUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHJlc3BvbnNlID09ICJ5ZXMiLCAxLCBOQSkpKSkpCiAgICAjIE5PVEU6IG5lZWQgdG8gcmVjb25jaWxlIHJhY2UvZXRobmljaXR5IGF0IHNvbWUgcG9pbnQuLi4KICAgICMgTk9URTogbmVlZCB0byBkZWFsIHdpdGggZ2VuZGVyIGF0IHNvbWUgcG9pbnQuLi4KICAKICAgIGRfY2xlYW4gPC0gZF9jbGVhbl8yCiAgICAKICAgICMgcmVtb3ZlIGV4dHJhbmVvdXMgZGZzIGFuZCB2YXJpYWJsZXMKICAgIHJtKGQsIGRfY2xlYW5fMikKICB9CiAgCiAgIyByZW1vdmUgb3V0bGllcnMgaWYgZGVzaXJlZAogIGlmKGNob3Nlbk91dGxpZXJIYW5kbGluZyA9PSAicmVtb3ZlIikgewogICAgCiAgICBkX2NsZWFuIDwtIGRfY2xlYW4gJT4lCiAgICAgIGdhdGhlcihjYXBhY2l0eSwgc2NvcmUsIGhhcHB5OnByaWRlKSAlPiUKICAgICAgZ3JvdXBfYnkoY2hhcmFjdGVyLCBjYXBhY2l0eSkgJT4lCiAgICAgIGZpbHRlcighc2NvcmUgJWluJSBib3hwbG90LnN0YXRzKHNjb3JlLCAyLjUpJG91dCkgJT4lCiAgICAgIHNwcmVhZChjYXBhY2l0eSwgc2NvcmUpICU+JQogICAgICBhcnJhbmdlKGNoYXJhY3Rlciwgc3ViaWQpCiAgICAKICB9CiAgCiAgIyBmaWx0ZXIgY2hhcmFjdGVycyBpZiBkZXNpcmVkCiAgaWYoaXMuZWxlbWVudCgibm9uZSIsIGNob3NlbkV4Y2x1ZGUpKSB7fSBlbHNlIHsKICAgIAogICAgZF9jbGVhbiA8LSBkX2NsZWFuICU+JQogICAgICBmaWx0ZXIoIWNoYXJhY3RlciAlaW4lIGNob3NlbkV4Y2x1ZGUpCiAgICAKICAgIH0KICAgIAogICMgZmlsdGVyIGl0ZW1zIGlmIGRlc2lyZWQKICBpZihpcy5lbGVtZW50KCJub25lIiwgY2hvc2VuRXhjbHVkZUl0ZW0pKSB7fSBlbHNlIHsKICAgIGRfY2xlYW4gPC0gZF9jbGVhbiAlPiUKICAgICAgZHBseXI6OmZpbHRlcighY2FwYWNpdHkgJWluJSBjaG9zZW5FeGNsdWRlSXRlbSkKICB9CiAgCiAgIyBkcm9wIHRyaWFscyA8MjUwIG1zCiAgZF9jbGVhbiA8LSBkX2NsZWFuICU+JQogICAgZmlsdGVyKHJ0ID49IDI1MCB8IGlzLm5hKHJ0KSkKICAKICAjIGNlbnRlciByZXNwb25zZSB2YXJpYWJsZQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFiIikgewogICAgZF9jbGVhbiA8LSBkX2NsZWFuICU+JQogICAgICBtdXRhdGUocmVzcG9uc2VOdW1DID0gcmVzcG9uc2VOdW0gLSA0KQogIH0gZWxzZSB7CiAgICBkX2NsZWFuIDwtIGRfY2xlYW4gJT4lCiAgICAgIG11dGF0ZShyZXNwb25zZU51bUMgPSByZXNwb25zZU51bSAtIDAuNSkKICB9CgogICAgIyByZW5hbWUgY2hhcmFjdGVyIG5hbWUgdmFyaWFibGVzCiAgaWYoImNoYXJOYW1lIiAlaW4lIG5hbWVzKGRfY2xlYW4pKSB7CiAgICBkX2NsZWFuIDwtIGRfY2xlYW4gJT4lIHJlbmFtZShjaGFyYWN0ZXIgPSBjaGFyTmFtZSkKICB9CiAgCiAgIyBjbGVhbnVwCiAgZF9jbGVhbiA8LSBkX2NsZWFuICU+JQogICAgZmlsdGVyKCFpcy5uYShzdWJpZCksICFpcy5uYShjaGFyYWN0ZXIpLCAhaXMubmEoY2FwYWNpdHkpKQogIAogICMgcmV0dXJuIGNsZWFuZWQgZGF0YXNldAogIHJldHVybihkX2NsZWFuKQp9CgojIG1ha2UgZnVuY3Rpb24gZm9yIHN0cmlwcGluZyBkYXRhZnJhbWVzIGZvciBkaW1lbnNpb24gcmVkdWNhdGlvbgptYWtlRFJERiA8LSBmdW5jdGlvbihkYXRhc291cmNlLCBjaG9zZW5Db25kaXRpb24pIHsKICAKICAjIHNldCB0YXJnZXQgZGF0YXNldAogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDEiKXtkIDwtIGQxfQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFiIil7ZCA8LSBkMWJ9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMWMiKXtkIDwtIGQxY30KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAyIil7ZCA8LSBkMn0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAzIil7ZCA8LSBkM30KICBpZihkYXRhc291cmNlID09ICJzdHVkeSA0Iil7ZCA8LSBkNH0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSA1Iil7ZCA8LSBkNX0KCiAgIyBmaWx0ZXIgYnkgY2hhcmFjdGVyIGlmIHNwZWNpZmllZAogIGlmKGNob3NlbkNvbmRpdGlvbiAlaW4lIGMoImJlZXRsZSIsICJyb2JvdCIpKSB7CiAgICBkIDwtIGQgJT4lIGZpbHRlcihjaGFyYWN0ZXIgPT0gY2hvc2VuQ29uZGl0aW9uKQogIH0KCiAgIyBtYWtlIHN0cmlwcGVkIGRhdGFmcmFtZSBmb3IgZGltZW5zaW9uIHJlZHVjYXRpb24gYW5hbHlzZXMKICBkX3N0cmlwIDwtIGQgJT4lCiAgICBmaWx0ZXIoIWlzLm5hKGNoYXJhY3RlciksICFpcy5uYShzdWJpZCksICFpcy5uYShjYXBhY2l0eSksIGNhcGFjaXR5ICE9ICIiKSAlPiUKICAgIG11dGF0ZShzdWJpZCA9IHBhc3RlKGNoYXJhY3Rlciwgc3ViaWQsIHNlcCA9ICJfIikpICU+JQogICAgc2VsZWN0KHN1YmlkLCBjYXBhY2l0eSwgcmVzcG9uc2VOdW0pICU+JQogICAgc3ByZWFkKGNhcGFjaXR5LCByZXNwb25zZU51bSkgJT4lCiAgICByZW1vdmVfcm93bmFtZXMoKSAlPiUKICAgIGNvbHVtbl90b19yb3duYW1lcyh2YXIgPSAic3ViaWQiKQoKICAjIHJldHVybiBzdHJpcHBlZCBkYXRhZnJhbWUKICByZXR1cm4oZF9zdHJpcCkKfQoKIyBtYWtlIGRlbW9ncmFwaGljcyBmdW5jdGlvbnMKZGVtb1NhbXBsZVNpemUgPC0gZnVuY3Rpb24oZGF0YXNvdXJjZSkgewoKICAjIHNldCB0YXJnZXQgZGF0YXNldAogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDEiKXtkIDwtIGQxfQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFiIil7ZCA8LSBkMWJ9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMWMiKXtkIDwtIGQxY30KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAyIil7ZCA8LSBkMn0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAzIil7ZCA8LSBkM30KICBpZihkYXRhc291cmNlID09ICJzdHVkeSA0Iil7ZCA8LSBkNH0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSA1Iil7ZCA8LSBkNX0KCiAgIyBnZXQgZGlzdGluY3Qgc3ViaWRzCiAgc2FtcGxlX3NpemUgPC0gZCAlPiUgZGlzdGluY3Qoc3ViaWQsIGNoYXJhY3RlcikgJT4lIGNvdW50KGNoYXJhY3RlcikgJT4lIGRhdGEuZnJhbWUoKQoKICAjIGFkZCB0b3RhbCBzYW1wbGUgc2l6ZSAgCiAgc2FtcGxlX3NpemUgPC0gcmJpbmQoc2FtcGxlX3NpemUgJT4lIG11dGF0ZShjaGFyYWN0ZXIgPSBhcy5jaGFyYWN0ZXIoY2hhcmFjdGVyKSksCiAgICAgICAgICAgICAgICAgICAgICAgYyhjaGFyYWN0ZXIgPSAiYWxsIiwgbiA9IGQgJT4lIGRpc3RpbmN0KHN1YmlkKSAlPiUgY291bnQoKSAlPiUgYXMubnVtZXJpYygpKSkKICAKICAjIHJldHVybiBkYXRhZnJhbWUKICByZXR1cm4oc2FtcGxlX3NpemUpCn0KZGVtb0R1cmF0aW9uIDwtIGZ1bmN0aW9uKGRhdGFzb3VyY2UpIHsKCiAgIyBzZXQgdGFyZ2V0IGRhdGFzZXQKICBpZihkYXRhc291cmNlID09ICJzdHVkeSAxIil7ZCA8LSBkMX0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAxYiIpe2QgPC0gZDFifQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFjIil7ZCA8LSBkMWN9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMiIpe2QgPC0gZDJ9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMyIpe2QgPC0gZDN9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgNCIpe2QgPC0gZDR9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgNSIpe2QgPC0gZDV9CgogICMgZ2V0IHNhbXBsZSBzaXplIHBlciBjaGFyYWN0ZXIKICBkdXJhdGlvbiA8LSBkICU+JQogICAgZGlzdGluY3Qoc3ViaWQsIGNoYXJhY3RlciwgZHVyYXRpb24pICU+JQogICAgbXV0YXRlKGR1cmF0aW9uID0gYXMubnVtZXJpYyhkdXJhdGlvbikpICU+JQogICAgZ3JvdXBfYnkoY2hhcmFjdGVyKSAlPiUKICAgIHN1bW1hcmlzZShtaW5fZHVyYXRpb24gPSBtaW4oZHVyYXRpb24sIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgbWF4X2R1cmF0aW9uID0gbWF4KGR1cmF0aW9uLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgIG1lZGlhbl9kdXJhdGlvbiA9IG1lZGlhbihkdXJhdGlvbiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICBtZWFuX2R1cmF0aW9uID0gbWVhbihkdXJhdGlvbiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICBzZF9kdXJhdGlvbiA9IHNkKGR1cmF0aW9uLCBuYS5ybSA9IFQpKQoKICAjIGFkZCB0b3RhbCBkdXJhdGlvbgogIGFsbCA8LSBkICU+JQogICAgZGlzdGluY3Qoc3ViaWQsIGNoYXJhY3RlciwgZHVyYXRpb24pICU+JQogICAgbXV0YXRlKGR1cmF0aW9uID0gYXMubnVtZXJpYyhkdXJhdGlvbikpICU+JQogICAgc3VtbWFyaXNlKG1pbl9kdXJhdGlvbiA9IG1pbihkdXJhdGlvbiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICBtYXhfZHVyYXRpb24gPSBtYXgoZHVyYXRpb24sIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgbWVkaWFuX2R1cmF0aW9uID0gbWVkaWFuKGR1cmF0aW9uLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgIG1lYW5fZHVyYXRpb24gPSBtZWFuKGR1cmF0aW9uLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgIHNkX2R1cmF0aW9uID0gc2QoZHVyYXRpb24sIG5hLnJtID0gVCkpICU+JQogICAgbXV0YXRlKGNoYXJhY3RlciA9ICJhbGwiKQogIAogIGR1cmF0aW9uIDwtIHJiaW5kKGR1cmF0aW9uLCBhbGwpICMgbm90IHN1cmUgd2h5IGZ1bGxfam9pbiBkb2Vzbid0IHdvcmsgICAgCgogICMgcmV0dXJuIGRhdGFmcmFtZQogIHJldHVybihkdXJhdGlvbikKfQpkZW1vQWdlIDwtIGZ1bmN0aW9uKGRhdGFzb3VyY2UpIHsKCiAgIyBzZXQgdGFyZ2V0IGRhdGFzZXQKICBpZihkYXRhc291cmNlID09ICJzdHVkeSAxIil7ZCA8LSBkMX0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAxYiIpe2QgPC0gZDFifQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFjIil7ZCA8LSBkMWN9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMiIpe2QgPC0gZDJ9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMyIpe2QgPC0gZDN9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgNCIpe2QgPC0gZDR9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgNSIpe2QgPC0gZDV9CgogICMgZ2V0IHNhbXBsZSBzaXplIHBlciBjaGFyYWN0ZXIKICBhZ2UgPC0gZCAlPiUKICAgIGRpc3RpbmN0KHN1YmlkLCBjaGFyYWN0ZXIsIGFnZSkgJT4lCiAgICBtdXRhdGUoYWdlID0gYXMubnVtZXJpYyhhZ2UpKSAlPiUKICAgIGdyb3VwX2J5KGNoYXJhY3RlcikgJT4lCiAgICBzdW1tYXJpc2UobWluX2FnZSA9IG1pbihhZ2UsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgbWF4X2FnZSA9IG1heChhZ2UsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgbWVkaWFuX2FnZSA9IG1lZGlhbihhZ2UsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgbWVhbl9hZ2UgPSBtZWFuKGFnZSwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICBzZF9hZ2UgPSBzZChhZ2UsIG5hLnJtID0gVCkpCgogICMgYWRkIHRvdGFsIGFnZQogIGFsbCA8LSBkICU+JQogICAgZGlzdGluY3Qoc3ViaWQsIGNoYXJhY3RlciwgYWdlKSAlPiUKICAgIG11dGF0ZShhZ2UgPSBhcy5udW1lcmljKGFnZSkpICU+JQogICAgc3VtbWFyaXNlKG1pbl9hZ2UgPSBtaW4oYWdlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgIG1heF9hZ2UgPSBtYXgoYWdlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgIG1lZGlhbl9hZ2UgPSBtZWRpYW4oYWdlLCBuYS5ybSA9IFQpLAogICAgICAgICAgICAgIG1lYW5fYWdlID0gbWVhbihhZ2UsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgc2RfYWdlID0gc2QoYWdlLCBuYS5ybSA9IFQpKSAlPiUKICAgIG11dGF0ZShjaGFyYWN0ZXIgPSAiYWxsIikKICBhZ2UgPC0gZnVsbF9qb2luKGFnZSwgYWxsKQoKICAjIHJldHVybiBkYXRhZnJhbWUKICByZXR1cm4oYWdlKQp9CmRlbW9HZW5kZXIgPC0gZnVuY3Rpb24oZGF0YXNvdXJjZSkgewoKICAjIHNldCB0YXJnZXQgZGF0YXNldAogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDEiKXtkIDwtIGQxfQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFiIil7ZCA8LSBkMWJ9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMWMiKXtkIDwtIGQxY30KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAyIil7ZCA8LSBkMn0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAzIil7ZCA8LSBkM30KICBpZihkYXRhc291cmNlID09ICJzdHVkeSA0Iil7ZCA8LSBkNH0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSA1Iil7ZCA8LSBkNX0KCiAgIyBnZXQgZ2VuZGVyIHBlciBjaGFyYWN0ZXIgYW5kIG92ZXJhbGwKICBnZW5kZXIgPC0gZGF0YS5mcmFtZShhZGRtYXJnaW5zKHdpdGgoZCAlPiUgZGlzdGluY3Qoc3ViaWQsIGNoYXJhY3RlciwgZ2VuZGVyKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlKGNoYXJhY3RlciwgZ2VuZGVyKSkpKSAlPiUKICAgIGZpbHRlcihnZW5kZXIgIT0gIlN1bSIpICU+JQogICAgcmVuYW1lKG4gPSBGcmVxKQogIAogIGdlbmRlciA8LSBnZW5kZXIgJT4lCiAgICBtdXRhdGUoY2hhcmFjdGVyID0gZmFjdG9yKGlmZWxzZShjaGFyYWN0ZXIgPT0gIlN1bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxsIiwgYXMuY2hhcmFjdGVyKGNoYXJhY3RlcikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJiZWV0bGUiLCAicm9ib3QiLCAiYWxsIikpKSAlPiUKICAgIGFycmFuZ2UoY2hhcmFjdGVyLCBnZW5kZXIpICU+JQogICAgc3ByZWFkKGdlbmRlciwgbikKICAKICAjIHJldHVybiBkYXRhZnJhbWUKICByZXR1cm4oZ2VuZGVyKQp9CmRlbW9SYWNlIDwtIGZ1bmN0aW9uKGRhdGFzb3VyY2UpIHsKCiAgIyBzZXQgdGFyZ2V0IGRhdGFzZXQKICBpZihkYXRhc291cmNlID09ICJzdHVkeSAxIil7ZCA8LSBkMX0KICBpZihkYXRhc291cmNlID09ICJzdHVkeSAxYiIpe2QgPC0gZDFifQogIGlmKGRhdGFzb3VyY2UgPT0gInN0dWR5IDFjIil7ZCA8LSBkMWN9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMiIpe2QgPC0gZDJ9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgMyIpe2QgPC0gZDN9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgNCIpe2QgPC0gZDR9CiAgaWYoZGF0YXNvdXJjZSA9PSAic3R1ZHkgNSIpe2QgPC0gZDV9CgogICMgZ2V0IHJhY2UgcGVyIGNoYXJhY3RlciBhbmQgb3ZlcmFsbAogIHJhY2UgPC0gZGF0YS5mcmFtZShhZGRtYXJnaW5zKHdpdGgoZCAlPiUgZGlzdGluY3Qoc3ViaWQsIGNoYXJhY3RlciwgcmFjZV9jYXQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlKGNoYXJhY3RlciwgcmFjZV9jYXQpKSkpICU+JQogICAgZmlsdGVyKHJhY2VfY2F0ICE9ICJTdW0iKSAlPiUKICAgIHJlbmFtZShuID0gRnJlcSkKCiAgICByYWNlIDwtIHJhY2UgJT4lCiAgICAgIG11dGF0ZShjaGFyYWN0ZXIgPSBmYWN0b3IoaWZlbHNlKGNoYXJhY3RlciA9PSAiU3VtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsbCIsIGFzLmNoYXJhY3RlcihjaGFyYWN0ZXIpKSkpICU+JQogICAgICBhcnJhbmdlKGNoYXJhY3RlciwgcmFjZV9jYXQpICU+JQogICAgICBzcHJlYWQocmFjZV9jYXQsIG4pCiAgCiAgIyByZXR1cm4gZGF0YWZyYW1lCiAgcmV0dXJuKHJhY2UpCn0KCiMgcGxvdHRpbmcgZnVuY3Rpb25zCm1ha2VGYWNldExhYnMgPC0gZnVuY3Rpb24oZGZfcGxvdHRpbmcpIHsKICBmYWNldF9sYWJlbHMgPC0gYXJyYXkoKQogIGRmX3Bsb3R0aW5nIDwtIGRmX3Bsb3R0aW5nICU+JSBtdXRhdGUoY2hhcmFjdGVyID0gZmFjdG9yKGNoYXJhY3RlcikpCiAgZm9yKGkgaW4gMTpsZW5ndGgobGV2ZWxzKGRmX3Bsb3R0aW5nJGNoYXJhY3RlcikpKSB7CiAgICBkZiA8LSBkZl9wbG90dGluZyAlPiUgZmlsdGVyKGNoYXJhY3RlciA9PSBsZXZlbHMoZGZfcGxvdHRpbmckY2hhcmFjdGVyKVtpXSkgJT4lCiAgICAgIHNlbGVjdChjaGFyYWN0ZXIsIG4pICU+JSB1bmlxdWUoKQogICAgZmFjZXRfbGFiZWxzW2ldIDwtIHBhc3RlMChkZiRjaGFyYWN0ZXIsICIgKG4gPSAiLCBkZiRuLCAiKSIpCiAgfQogIG5hbWVzKGZhY2V0X2xhYmVscykgPC0gbGV2ZWxzKGRmX3Bsb3R0aW5nJGNoYXJhY3RlcikKICByZXR1cm4oZmFjZXRfbGFiZWxzKQp9CmBgYAoKYGBge3IgbW9kZWxpbmcgZGVjaXNpb25zLCBpbmNsdWRlID0gRn0KIyByZW1vdmUgb3V0bGllcnM/CmNob3Nlbk91dGxpZXJIYW5kbGluZyA8LSAia2VlcCIKIyBjaG9zZW5PdXRsaWVySGFuZGxpbmcgPC0gInJlbW92ZSIKCiMgZXhjbHVkZSBhbnkgY29uZGl0aW9ucyAoY2hhcmFjdGVycyk/CmNob3NlbkV4Y2x1ZGUgPC0gIm5vbmUiCiMgY2hvc2VuRXhjbHVkZSA8LSBjKCJzdGFwbGVyIiwgImNhciIsICJjb21wdXRlciIpCgojIGV4Y2x1ZGUgYW55IGl0ZW1zIChtZW50YWwgY2FwYWNpdGllcyk/CiMgY2hvc2VuRXhjbHVkZUl0ZW0gPC0gIm5vbmUiCiMgY2hvc2VuRXhjbHVkZUl0ZW0gPC0gImNvbXB1dGF0aW9ucyIKY2hvc2VuRXhjbHVkZUl0ZW0gPC0gYygibWV0YWwiLCAib25fb2ZmIikKCiMgTk9URTogYWx3YXlzIGNob29zZSBtaW5pbWFsIHJlc2lkdWFsIChmbSA9ICJtaW5yZXMiKSBpbnN0ZWFkIG9mIE1MIGJlY2F1c2Ugb2Ygbm9uLW5vcm1hbGl0eQoKIyBmb3IgRUZBcywgd2hhdCBraW5kIG9mIGNvcnJlbGF0aW9uPwpjaG9zZW5Db3JUeXBlIDwtICJjb3IiICMgcGVhcnNvbiBjb3JyZWxhdGlvbgojIGNob3NlbkNvclR5cGUgPC0gInBvbHkiICMgcG9seWNob3JpYyBjb3JyZWxhdGlvbgoKIyBmb3IgRUZBcywgd2hhdCBraW5kIG9mIHJvdGF0aW9uPwojIGNob3NlblJvdFR5cGUgPC0gInZhcmltYXgiICMgdmFyaW1heCByb3RhdGlvbgpjaG9zZW5Sb3RUeXBlIDwtICJvYmxpbWluIiAjIG9ibGltaW4gcm90YXRpb24KIyBjaG9zZW5Sb3RUeXBlIDwtICJub25lIiAjIG5vIHJvdGF0aW9uCgpkYXRhLmZyYW1lKCJjb25kaXRpb25zRXhjbHVkZWQiID0gY2hvc2VuRXhjbHVkZSwKICAgICAgICAgICAib3V0bGllckhhbmRsaW5nIiA9IGNob3Nlbk91dGxpZXJIYW5kbGluZywKICAgICAgICAgICAiRUZBX2NvcnJlbGF0aW9uIiA9IGNob3NlbkNvclR5cGUsCiAgICAgICAgICAgIkVGQV9yb3RhdGlvbiIgPSBjaG9zZW5Sb3RUeXBlKQpgYGAKCiMgRGF0YSBwcmVwYXJhdGlvbgoKYGBge3IgZGF0YSB1cGxvYWQsIGluY2x1ZGUgPSBGfQojIHN0dWR5IDEgKDIwMTYtMDctMDYsIGFkdWx0cywgMiBjb25kaXRpb25zLCAzLXBvaW50IHNjYWxlLCAiZGVjaWRlIHdoYXQgdG8gZG8iIGFuZCAibWFrZSBwbGFucyIpCmRfcmF3X3N0dWR5MSA8LSByZWFkLmNzdigiL1VzZXJzL2t3ZWlzbWFuL0RvY3VtZW50cy9SZXNlYXJjaCAoU3RhbmZvcmQpL1Byb2plY3RzL0RpbWtpZC9kaW1raWQvZGF0YS9hZHVsdHMvdXNfcnVuLTAxXzIwMTYtMDYtMDVfYW5vbnltaXplZC5jc3YiKSAlPiUKICBtdXRhdGUoc3R1ZHkgPSAic3R1ZHkgMSIsIGFnZV9ncm91cCA9ICJhZHVsdHMiKSAlPiUgc2VsZWN0KC1YKQoKIyBzdHVkeSAxYiAoMjAxNy0wNy0xOSwgYWR1bHRzLCAyIGNvbmRpdGlvbnMsIDctcG9pbnQgc2NhbGUsICJkZWNpZGUgd2hhdCB0byBkbyIgYW5kICJtYWtlIHBsYW5zIikKZF9yYXdfc3R1ZHkxYiA8LSByZWFkLmNzdigiL1VzZXJzL2t3ZWlzbWFuL0RvY3VtZW50cy9SZXNlYXJjaCAoU3RhbmZvcmQpL1Byb2plY3RzL0RpbWtpZC9kaW1raWQvZGF0YS9hZHVsdHMvdXNfcnVuLTAyXzIwMTYtMDctMTlfYW5vbnltaXplZC5jc3YiKSAlPiUKICBtdXRhdGUoc3R1ZHkgPSAic3R1ZHkgMWIiLCBhZ2VfZ3JvdXAgPSAiYWR1bHRzIikgJT4lIHNlbGVjdCgtWCkKCiMgc3R1ZHkgMWMgKDIwMTYtMTItMDgsIGFkdWx0cywgMiBjb25kaXRpb25zLCAzLXBvaW50IHNjYWxlLCAiaGF2ZSBmcmVlIHdpbGwiIGFuZCAiaGF2ZSBpbnRlbnRpb25zIikKZF9yYXdfc3R1ZHkxYyA8LSByZWFkLmNzdigiL1VzZXJzL2t3ZWlzbWFuL0RvY3VtZW50cy9SZXNlYXJjaCAoU3RhbmZvcmQpL1Byb2plY3RzL0RpbWtpZC9kaW1raWQvZGF0YS9hZHVsdHMvdXNfcnVuLTAzXzIwMTYtMTItMDhfYW5vbnltaXplZC5jc3YiKSAlPiUKICBtdXRhdGUoc3R1ZHkgPSAic3R1ZHkgMWMiLCBhZ2VfZ3JvdXAgPSAiYWR1bHRzIikgJT4lIHNlbGVjdCgtWCkKCiMgc3R1ZHkgMiAoSnVuZSAtIERlY2VtYmVyIDIwMTYsIDctOXlvLCAyIGNvbmRpdGlvbnMsIDMtcG9pbnQtc2NhbGUsICJkZWNpZGUgd2hhdCB0byBkbyIgYW5kICJtYWtlIHBsYW5zIikKZF9yYXdfc3R1ZHkyIDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRG9jdW1lbnRzL1Jlc2VhcmNoIChTdGFuZm9yZCkvUHJvamVjdHMvRGlta2lkL2RpbWtpZC9kYXRhL2NoaWxkcmVuL3J1bi0wMV8yMDE3LTA3LTI0X2Fub255bWl6ZWQuY3N2IikgJT4lCiAgbXV0YXRlKHN0dWR5ID0gInN0dWR5IDIiLCBhZ2VfZ3JvdXAgPSAiY2hpbGRyZW5fNzkiKSAlPiUgc2VsZWN0KC1YKQoKIyBzdHVkeSAzIChKYW51YXJ5IC0gSnVuZSAyMDE3LCA3LTl5bywgOSBjb25kaXRpb25zLCAzLXBvaW50LXNjYWxlLCAiZGVjaWRlIHdoYXQgdG8gZG8iIGFuZCAibWFrZSBwbGFucyIpCmRfcmF3X3N0dWR5MyA8LSByZWFkLmNzdigiL1VzZXJzL2t3ZWlzbWFuL0RvY3VtZW50cy9SZXNlYXJjaCAoU3RhbmZvcmQpL1Byb2plY3RzL0RpbWtpZC9kaW1raWQvZGF0YS9jaGlsZHJlbi9ydW4tMDJfMjAxNy0wOC0wOF9hbm9ueW1pemVkLmNzdiIpICU+JQogIG11dGF0ZShzdHVkeSA9ICJzdHVkeSAzIiwgYWdlX2dyb3VwID0gImNoaWxkcmVuXzc5IikgJT4lIHNlbGVjdCgtWCkgJT4lCiAgbXV0YXRlKGRvYiA9IHBhcnNlX2RhdGV0aW1lKGRhdGVPZkJpcnRoLCAiJW0vJWQvJXkiKSwKICAgICAgICAgZG90ID0gcGFyc2VfZGF0ZXRpbWUoZ3N1YigiMjAxNyIsICIxNyIsIGRhdGVPZlRlc3QpLCAiJW0vJWQvJXkiKSwgCiAgICAgICAgIGFnZSA9IGludGVydmFsKHN0YXJ0ID0gZG9iLCBlbmQgPSBkb3QpIC8gZHVyYXRpb24obnVtID0gMSwgdW5pdHMgPSAieWVhcnMiKSkgJT4lCiAgc2VsZWN0KC1kYXRlT2ZCaXJ0aCwgLWRhdGVPZlRlc3QsIC1kb2IsIC1kb3QpCgojIHN0dWR5IDQgKE1heSAyMDE3IC0gcHJlc2VudCwgNC02eW8sIDkgY29uZGl0aW9ucywgMy1wb2ludC1zY2FsZSwgImRlY2lkZSB3aGF0IHRvIGRvIiBhbmQgIm1ha2UgcGxhbnMiKQpkX3Jhd19zdHVkeTQgPC0gcmVhZC5jc3YoIi9Vc2Vycy9rd2Vpc21hbi9Eb2N1bWVudHMvUmVzZWFyY2ggKFN0YW5mb3JkKS9Qcm9qZWN0cy9EaW1raWQvZGlta2lkL2RhdGEvY2hpbGRyZW4vcnVuLTAzXzIwMTctMDgtMjFfYW5vbnltaXplZC5jc3YiKSAlPiUKICBtdXRhdGUoc3R1ZHkgPSAic3R1ZHkgNCIsIGFnZV9ncm91cCA9ICJjaGlsZHJlbl80NiIpICU+JSBzZWxlY3QoLVgpICU+JQogIG11dGF0ZShkb2IgPSBwYXJzZV9kYXRldGltZShkYXRlT2ZCaXJ0aCwgIiVtLyVkLyV5IiksCiAgICAgICAgIGRvdCA9IHBhcnNlX2RhdGV0aW1lKGdzdWIoIjIwMTciLCAiMTciLCBkYXRlT2ZUZXN0KSwgIiVtLyVkLyV5IiksIAogICAgICAgICBhZ2UgPSBpbnRlcnZhbChzdGFydCA9IGRvYiwgZW5kID0gZG90KSAvIGR1cmF0aW9uKG51bSA9IDEsIHVuaXRzID0gInllYXJzIikpICU+JQogIHNlbGVjdCgtZGF0ZU9mQmlydGgsIC1kYXRlT2ZUZXN0LCAtZG9iLCAtZG90KQoKIyBzdHVkeSA1IChGYWxsIDIwMTcgLSBwcmVzZW50LCA1LjUtNy41eW8gKHBsdXMpLCA5IGNvbmRpdGlvbnMsIDMtcG9pbnQtc2NhbGUsICJkZWNpZGUgd2hhdCB0byBkbyIgYW5kICJtYWtlIHBsYW5zIikKZF9yYXdfc3R1ZHk1IDwtIHJlYWQuY3N2KCIvVXNlcnMva3dlaXNtYW4vRG9jdW1lbnRzL1Jlc2VhcmNoIChTdGFuZm9yZCkvUHJvamVjdHMvRGlta2lkL2RpbWtpZC9kYXRhL2NoaWxkcmVuL3J1bi0wNF8yMDE3LTEwLTEwX2Fub255bWl6ZWQuY3N2IikgJT4lCiAgbXV0YXRlKHN0dWR5ID0gInN0dWR5IDUiLCBhZ2VfZ3JvdXAgPSAiY2hpbGRyZW5fNS41Ny41IikgJT4lIHNlbGVjdCgtWCkgJT4lCiAgbXV0YXRlKGRvYiA9IHBhcnNlX2RhdGV0aW1lKGRhdGVPZkJpcnRoLCAiJW0vJWQvJXkiKSwKICAgICAgICAgZG90ID0gcGFyc2VfZGF0ZXRpbWUoZ3N1YigiMjAxNyIsICIxNyIsIGRhdGVPZlRlc3QpLCAiJW0vJWQvJXkiKSwgCiAgICAgICAgIGFnZSA9IGludGVydmFsKHN0YXJ0ID0gZG9iLCBlbmQgPSBkb3QpIC8gZHVyYXRpb24obnVtID0gMSwgdW5pdHMgPSAieWVhcnMiKSkgJT4lCiAgc2VsZWN0KC1kYXRlT2ZCaXJ0aCwgLWRhdGVPZlRlc3QsIC1kb2IsIC1kb3QpCmBgYAoKYGBge3IgZGF0YSBjbGVhbnVwLCBpbmNsdWRlID0gRn0KIyBjbGVhbiB1cCBkYXRhc2V0cwpkMSA8LSBjbGVhbnVwKCJzdHVkeSAxIiwgImFkdWx0cyIpCmQxYiA8LSBjbGVhbnVwKCJzdHVkeSAxIiwgImFkdWx0cyIpCmQxYyA8LSBjbGVhbnVwKCJzdHVkeSAxIiwgImFkdWx0cyIpCmQyIDwtIGNsZWFudXAoInN0dWR5IDIiLCAiY2hpbGRyZW4iKQpkMyA8LSBjbGVhbnVwKCJzdHVkeSAzIiwgImNoaWxkcmVuIikKZDQgPC0gY2xlYW51cCgic3R1ZHkgNCIsICJjaGlsZHJlbiIpCmQ1IDwtIGNsZWFudXAoInN0dWR5IDUiLCAiY2hpbGRyZW4iKQoKIyB0d2VhayBieSBoYW5kCmQyIDwtIGQyICU+JQogIGZpbHRlcighaXMubmEoYWdlKSkgJT4lCiAgZmlsdGVyKGFnZSA+PSA3LCBhZ2UgPCAxMCkgJT4lCiAgZmlsdGVyKGNoYXJhY3RlciAhPSAiZWxlcGhhbnQiKQoKZDNfb3V0c2lkZWFnZSA8LSBkMyAlPiUgZmlsdGVyKGFnZSA8IDcgfCBhZ2UgPj0gMTApICU+JSBkaXN0aW5jdChzdWJpZCkKCmQzIDwtIGQzICU+JQogIGZpbHRlcighaXMubmEoY2hhcmFjdGVyKSwgY2hhcmFjdGVyICE9ICIiKSAlPiUKICBmaWx0ZXIoIXN1YmlkICVpbiUgZDNfb3V0c2lkZWFnZSRzdWJpZCkgJT4lCiAgIyBmaWx0ZXIoYWdlID49IDcsIGFnZSA8IDEwKSAlPiUKICBtdXRhdGUoZXRobmljaXR5ID0gZ3N1YigiIFNOIiwgIiIsIGV0aG5pY2l0eSkpICU+JQogIG11dGF0ZShyYWNlX2NhdCA9IGlmZWxzZShncmVwbCgiYmluZyIsIHRvbG93ZXIodGVzdGluZ1NpdGUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGV0aG5pY2l0eSA9PSAiQSIsICJlYXN0X2FzaWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShldGhuaWNpdHkgPT0gIkMiIHwgZXRobmljaXR5ID09ICJDaiIsICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGV0aG5pY2l0eSA9PSAiSSIsICJzb3V0aF9hc2lhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShldGhuaWNpdHkgPT0gIk1FIiwgIm1pZGRsZV9lYXN0ZXJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShldGhuaWNpdHkgPT0gIkFmIiwgImJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZXRobmljaXR5ID09ICJIIiwgImhpc3BhbmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIgIiwgZXRobmljaXR5KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCIvIiwgZXRobmljaXR5KSwgIm11bHRpcmFjaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpKSkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRvbG93ZXIoZXRobmljaXR5KSA9PSAiYmxhY2sgb3IgYWZyaWNhbiBhbWVyaWNhbiIsICJibGFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodG9sb3dlcihldGhuaWNpdHkpID09ICJoaXNwYW5pYyBvciBsYXRpbm8vYSIsICJoaXNwYW5pYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRvbG93ZXIoZXRobmljaXR5KSA9PSAiZWFzdCBhc2lhbiIsICJlYXN0X2FzaWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRvbG93ZXIoZXRobmljaXR5KSA9PSAibmF0aXZlIGFtZXJpY2FuLCBhbWVyaWNhbiBpbmRpYW4sIG9yIGFsYXNrYSBuYXRpdmUiLCAibmF0aXZlX2FtZXJpY2FuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0b2xvd2VyKGV0aG5pY2l0eSkgPT0gIndoaXRlIiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2xvd2VyKGV0aG5pY2l0eSkgPT0gIndoaXRlLCBjYXVjYXNpYW4sIG9yIGV1cm9wZWFuIGFtZXJpY2FuIiwgIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodG9sb3dlcihldGhuaWNpdHkpID09ICJzb3V0aCBvciBzb3V0aGVhc3QgYXNpYW4iIHwgdG9sb3dlcihldGhuaWNpdHkpID09ICJzb3V0aCBhc2lhbiIsICJzb3V0aF9hc2lhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0b2xvd2VyKGV0aG5pY2l0eSkgPT0gIiIgfCBpcy5uYShldGhuaWNpdHkpLCBOQSwgIm11bHRpcmFjaWFsIikpKSkpKSkpKQoKZDQgPC0gZDQgJT4lCiAgZmlsdGVyKCFpcy5uYShjaGFyYWN0ZXIpLCBjaGFyYWN0ZXIgIT0gIiIpICU+JQogIGZpbHRlcihhZ2UgPj0gNCwgYWdlIDwgNykgJT4lCiAgbXV0YXRlKGV0aG5pY2l0eSA9IGdzdWIoIiBTTiIsICIiLCBldGhuaWNpdHkpKSAlPiUKICBtdXRhdGUocmFjZV9jYXQgPSBpZmVsc2UoZ3JlcGwoImJpbmciLCB0b2xvd2VyKHRlc3RpbmdTaXRlKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShldGhuaWNpdHkgPT0gIkEiLCAiZWFzdF9hc2lhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZXRobmljaXR5ID09ICJDIiB8IGV0aG5pY2l0eSA9PSAiQ2oiLCAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShldGhuaWNpdHkgPT0gIkkiLCAic291dGhfYXNpYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZXRobmljaXR5ID09ICJNRSIsICJtaWRkbGVfZWFzdGVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZXRobmljaXR5ID09ICJBZiIsICJibGFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGV0aG5pY2l0eSA9PSAiSCIsICJoaXNwYW5pYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiICIsIGV0aG5pY2l0eSkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwbCgiLyIsIGV0aG5pY2l0eSksICJtdWx0aXJhY2lhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQSkpKSkpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0b2xvd2VyKGV0aG5pY2l0eSkgPT0gImJsYWNrIG9yIGFmcmljYW4gYW1lcmljYW4iLCAiYmxhY2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRvbG93ZXIoZXRobmljaXR5KSA9PSAiaGlzcGFuaWMgb3IgbGF0aW5vL2EiLCAiaGlzcGFuaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0b2xvd2VyKGV0aG5pY2l0eSkgPT0gImVhc3QgYXNpYW4iLCAiZWFzdF9hc2lhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0b2xvd2VyKGV0aG5pY2l0eSkgPT0gIm5hdGl2ZSBhbWVyaWNhbiwgYW1lcmljYW4gaW5kaWFuLCBvciBhbGFza2EgbmF0aXZlIiwgIm5hdGl2ZV9hbWVyaWNhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodG9sb3dlcihldGhuaWNpdHkpID09ICJ3aGl0ZSIgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9sb3dlcihldGhuaWNpdHkpID09ICJ3aGl0ZSwgY2F1Y2FzaWFuLCBvciBldXJvcGVhbiBhbWVyaWNhbiIsICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRvbG93ZXIoZXRobmljaXR5KSA9PSAic291dGggb3Igc291dGhlYXN0IGFzaWFuIiB8IHRvbG93ZXIoZXRobmljaXR5KSA9PSAic291dGggYXNpYW4iLCAic291dGhfYXNpYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodG9sb3dlcihldGhuaWNpdHkpID09ICIiIHwgaXMubmEoZXRobmljaXR5KSwgTkEsICJtdWx0aXJhY2lhbCIpKSkpKSkpKSkKCmQ1IDwtIGQ1ICU+JQogIGZpbHRlcighaXMubmEoY2hhcmFjdGVyKSwgY2hhcmFjdGVyICE9ICIiKSAlPiUKICBmaWx0ZXIoYWdlID49IDUuNSwgYWdlIDwgNy41KSAlPiUKICBtdXRhdGUoZXRobmljaXR5ID0gZ3N1YigiIFNOIiwgIiIsIGV0aG5pY2l0eSkpICU+JQogIG11dGF0ZShyYWNlX2NhdCA9IGlmZWxzZShncmVwbCgiYmluZyIsIHRvbG93ZXIodGVzdGluZ1NpdGUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGV0aG5pY2l0eSA9PSAiQSIsICJlYXN0X2FzaWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShldGhuaWNpdHkgPT0gIkMiIHwgZXRobmljaXR5ID09ICJDaiIsICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGV0aG5pY2l0eSA9PSAiSSIsICJzb3V0aF9hc2lhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShldGhuaWNpdHkgPT0gIk1FIiwgIm1pZGRsZV9lYXN0ZXJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShldGhuaWNpdHkgPT0gIkFmIiwgImJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZXRobmljaXR5ID09ICJIIiwgImhpc3BhbmljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIgIiwgZXRobmljaXR5KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXBsKCIvIiwgZXRobmljaXR5KSwgIm11bHRpcmFjaWFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BKSkpKSkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRvbG93ZXIoZXRobmljaXR5KSA9PSAiYmxhY2sgb3IgYWZyaWNhbiBhbWVyaWNhbiIsICJibGFjayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodG9sb3dlcihldGhuaWNpdHkpID09ICJoaXNwYW5pYyBvciBsYXRpbm8vYSIsICJoaXNwYW5pYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRvbG93ZXIoZXRobmljaXR5KSA9PSAiZWFzdCBhc2lhbiIsICJlYXN0X2FzaWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRvbG93ZXIoZXRobmljaXR5KSA9PSAibmF0aXZlIGFtZXJpY2FuLCBhbWVyaWNhbiBpbmRpYW4sIG9yIGFsYXNrYSBuYXRpdmUiLCAibmF0aXZlX2FtZXJpY2FuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0b2xvd2VyKGV0aG5pY2l0eSkgPT0gIndoaXRlIiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2xvd2VyKGV0aG5pY2l0eSkgPT0gIndoaXRlLCBjYXVjYXNpYW4sIG9yIGV1cm9wZWFuIGFtZXJpY2FuIiwgIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodG9sb3dlcihldGhuaWNpdHkpID09ICJzb3V0aCBvciBzb3V0aGVhc3QgYXNpYW4iIHwgdG9sb3dlcihldGhuaWNpdHkpID09ICJzb3V0aCBhc2lhbiIsICJzb3V0aF9hc2lhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0b2xvd2VyKGV0aG5pY2l0eSkgPT0gIiIgfCBpcy5uYShldGhuaWNpdHkpLCBOQSwgIm11bHRpcmFjaWFsIikpKSkpKSkpKQpgYGAKCmBgYHtyIGRhdGFmcmFtZXMgZm9yIGRpbWVuc2lvbiByZWR1Y2F0aW9uLCBpbmNsdWRlID0gRn0KIyBtYWtlIGRhdGFmcmFtZXMgZm9yIHMxCiMgZDFfYmVldGxlIDwtIG1ha2VEUkRGKCJzdHVkeSAxIiwgImJlZXRsZSIpCiMgZDFfcm9ib3QgPC0gbWFrZURSREYoInN0dWR5IDEiLCAicm9ib3QiKQpkMV9hbGwgPC0gbWFrZURSREYoInN0dWR5IDEiLCAiYWxsIikKCiMgbWFrZSBkYXRhZnJhbWVzIGZvciBmb2xsb3ctdXAgc3R1ZGllcyB0byBzMQpkMWJfYWxsIDwtIG1ha2VEUkRGKCJzdHVkeSAxYiIsICJhbGwiKQpkMWNfYWxsIDwtIG1ha2VEUkRGKCJzdHVkeSAxYyIsICJhbGwiKQoKIyBtYWtlIGRhdGFmcmFtZXMgZm9yIHN0dWR5IDIKIyBkMl9iZWV0bGUgPC0gbWFrZURSREYoInN0dWR5IDIiLCAiYmVldGxlIikKIyBkMl9yb2JvdCA8LSBtYWtlRFJERigic3R1ZHkgMiIsICJyb2JvdCIpCmQyX2FsbCA8LSBtYWtlRFJERigic3R1ZHkgMiIsICJhbGwiKQoKIyBtYWtlIGRhdGFmcmFtZXMgZm9yIHN0dWR5IDMKIyBkM19iZWV0bGUgPC0gbWFrZURSREYoInN0dWR5IDMiLCAiYmVldGxlIikKIyBkM19yb2JvdCA8LSBtYWtlRFJERigic3R1ZHkgMyIsICJyb2JvdCIpCmQzX2FsbCA8LSBtYWtlRFJERigic3R1ZHkgMyIsICJhbGwiKQoKIyBtYWtlIGRhdGFmcmFtZXMgZm9yIHN0dWR5IDQKZDRfYWxsIDwtIG1ha2VEUkRGKCJzdHVkeSA0IiwgImFsbCIpCmBgYAoKYGBge3IgZGF0YWZyYW1lIGZvciBzbGlkaW5nIHdpbmRvdywgaW5jbHVkZSA9IEZ9CiMgbWVyZ2UgZGF0YXNldHMgZnJvbSBzdHVkaWVzIDMtNCBhbmQgcnVuIDA0CmRfc2xpZGUgPC0gZDMgJT4lCiAgc2VsZWN0KC10cmlhbC5jb21tZW50cykgJT4lCiAgZnVsbF9qb2luKGQ0ICU+JSBzZWxlY3QoLXRyaWFsLmNvbW1lbnRzKSkgJT4lCiAgZnVsbF9qb2luKGQ1ICU+JSBzZWxlY3QoLXRyaWFsLmNvbW1lbnRzKSkgJT4lCiAgbXV0YXRlKGNhcGFjaXR5ID0gcmVjb2RlKGNhcGFjaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICBhbmdyeSA9ICJhbmdlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZXMgPSAiY2hvaWNlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2Npb3VzID0gImF3YXJlbmVzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlc3NlZCA9ICJzYWRuZXNzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggPSAiZGVwdGgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNyZXNwZWN0ZWQgPSAiaHVydCBmZWVsaW5ncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYmFycmFzc2VkID0gImVtYmFycmFzc21lbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmZWFyID0gImZlYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBndWlsdCA9ICJndWlsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcHB5ID0gImhhcHBpbmVzcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1bmdyeSA9ICJodW5nZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBsb3ZlID0gImxvdmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBuYXVzZWF0ZWQgPSAibmF1c2VhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb2RvcnMgPSAic21lbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwYWluID0gInBhaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlkZSA9ICJwcmlkZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbmluZyA9ICJmaWd1cmluZyBvdXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZW1lbWJlcmluZyA9ICJtZW1vcnkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wZXJhdHVyZSA9ICJ0ZW1wZXJhdHVyZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpcmVkID0gImZhdGlndWUiKSkKCiMgZ2V0IGFnZSByYW5rcwpkX3NsaWRlX3N1YmlkIDwtIGRfc2xpZGUgJT4lCiAgZGlzdGluY3Qoc3ViaWQsIGFnZSkgJT4lCiAgYXJyYW5nZShhZ2UsIHN1YmlkKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oImFnZV9yYW5rIikgJT4lCiAgbXV0YXRlKGFnZV9yYW5rID0gYXMubnVtZXJpYyhhZ2VfcmFuaykpCgpkX3NsaWRlIDwtIGRfc2xpZGUgJT4lCiAgZmlsdGVyKHN1YmlkICVpbiUgZF9zbGlkZV9zdWJpZCRzdWJpZCkgJT4lCiAgbGVmdF9qb2luKGRfc2xpZGVfc3ViaWQpICU+JQogIGFycmFuZ2UoYWdlX3JhbmssIHRyaWFsTnVtKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGFnZSkpCgojIG1ha2Ugd2lkZWZyYW1lIGRmCmRfc2xpZGVfYWxsIDwtIGRfc2xpZGUgJT4lCiAgc2VsZWN0KHN1YmlkLCBhZ2UsIGNoYXJhY3RlciwgY2FwYWNpdHksIHJlc3BvbnNlTnVtKSAlPiUKICBtdXRhdGUoYWdlID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoYWdlKSkpICU+JQogIHNwcmVhZChjYXBhY2l0eSwgcmVzcG9uc2VOdW0pICU+JQogIGFycmFuZ2UoYWdlKSAlPiUKICByZW1vdmVfcm93bmFtZXMoKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkIikKCiMgbGltaXQgdG8gY29tcGxldGUgY2FzZXMgZm9yIHRzbmUKZF9zbGlkZV9hbGxfY29tcGxldGUgPC0gZF9zbGlkZV9hbGxbY29tcGxldGUuY2FzZXMoZF9zbGlkZV9hbGwpLF0KYGBgCgojIFRvcGljIG1vZGVsaW5nCgojIyBBZHVsdHMsIDctcG9pbnQgc2NhbGUKCmBgYHtyfQojIG1ha2Ugd2lkZWZyYW1lIGRmCmQxYl9wcmVwIDwtIGQxYiAlPiUKICBzZWxlY3Qoc3ViaWQsIGFnZSwgY2hhcmFjdGVyLCBjYXBhY2l0eSwgcmVzcG9uc2VOdW0pICU+JQogIG11dGF0ZShhZ2UgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihhZ2UpKSkgJT4lCiAgc3ByZWFkKGNhcGFjaXR5LCByZXNwb25zZU51bSkgJT4lCiAgYXJyYW5nZShhZ2UpICU+JQogIHJlbW92ZV9yb3duYW1lcygpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygic3ViaWQiKQoKIyBsaW1pdCB0byBjb21wbGV0ZSBjYXNlcyBmb3IgdHNuZQpkMWJfYWxsX2NvbXBsZXRlIDwtIGQxYl9wcmVwW2NvbXBsZXRlLmNhc2VzKGQxYl9wcmVwKSxdCgojIG1ha2UgTERBLWZyaWVuZGx5IGRmCmQxYl9MREEgPC0gZDFiX2FsbF9jb21wbGV0ZSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikgJT4lCiAgc2VsZWN0KC1hZ2UsIC1jaGFyYWN0ZXIpICU+JQogIGdhdGhlcihjYXBhY2l0eSwgcmVzcG9uc2UsIC1zdWJpZCkgJT4lCiAgbXV0YXRlKHJlc3BvbnNlID0gaWZlbHNlKHJlc3BvbnNlID4gMCwgMSwgcmVzcG9uc2UpKSAjIGxlZ2l0PwogICMgbXV0YXRlKHJlc3BvbnNlID0gKHJlc3BvbnNlICogMikpICMgaXMgdGhpcyBsZWdpdD8gbm90IGNvdW50cy4uLgoKZDFiX0xEQV9rZWVwIDwtIGQxYl9MREEgJT4lCiAgdW5ncm91cCgpICU+JQogIGdyb3VwX2J5KHN1YmlkKSAlPiUKICBzdW1tYXJpc2Uoc3VtID0gc3VtKHJlc3BvbnNlLCBuYS5ybSA9IFQpKSAlPiUKICBmaWx0ZXIoc3VtICE9IDApICU+JQogIG11dGF0ZShzdWJpZCA9IGFzLmNoYXJhY3RlcihzdWJpZCkpCiAgCmQxYl9MREEgPC0gZDFiX0xEQSAlPiUKICBmaWx0ZXIoc3ViaWQgJWluJSBkMWJfTERBX2tlZXAkc3ViaWQpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzcHJlYWQoY2FwYWNpdHksIHJlc3BvbnNlKSAlPiUKICByZW1vdmVfcm93bmFtZXMoKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkIikKCiMgZG8gTERBCmQxYl9MREEgPC0gTERBKHggPSBkMWJfTERBLCBrID0gMTApCmBgYAoKYGBge3J9CiMgbG9vayBhdCB0ZXJtcyBieSB0b3BpYwpkMWJfTERBX3RvcGljcyA8LSB0aWR5KGQxYl9MREEsIG1hdHJpeCA9ICJiZXRhIikKCmQxYl9MREFfdGVybW9yZGVyIDwtIGQxYl9MREFfdG9waWNzICU+JQogIGdyb3VwX2J5KHRlcm0pICU+JQogIHRvcF9uKDEsIGJldGEpICU+JQogIGFycmFuZ2UodG9waWMsIGRlc2MoYmV0YSkpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oIm9yZGVyIikgJT4lCiAgbXV0YXRlKG9yZGVyID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIob3JkZXIpKSkKCmdncGxvdChkMWJfTERBX3RvcGljcyAlPiUKICAgICAgICAgZnVsbF9qb2luKGQxYl9MREFfdGVybW9yZGVyICU+JSBzZWxlY3QodGVybSwgb3JkZXIpKSAlPiUKICAgICAgICAgZGlzdGluY3QoKSwKICAgICAgIGFlcyh4ID0gdG9waWMsIHkgPSByZW9yZGVyKHRlcm0sIGRlc2Mob3JkZXIpKSwgZmlsbCA9IGJldGEpKSArCiAgZ2VvbV90aWxlKCkgKwogIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiWWxHbiIsIGRpcmVjdGlvbiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcih0aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhcmhlaWdodCA9IDEwKSkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuaGVpZ2h0ID0gMn0KIyBsb29rIGF0IHRvcGljcyBieSAiZG9jdW1lbnQiIChwYXJ0aWNpcGFudCkKZDFiX0xEQV9kb2N1bWVudHMgPC0gdGlkeShkMWJfTERBLCBtYXRyaXggPSAiZ2FtbWEiKSAlPiUKICByZW5hbWUoc3ViaWQgPSBkb2N1bWVudCkKCmQxYl9MREFfZG9jb3JkZXIgPC0gZDFiX0xEQV9kb2N1bWVudHMgJT4lCiAgZ3JvdXBfYnkoc3ViaWQpICU+JQogIHRvcF9uKDEsIGdhbW1hKSAlPiUKICBhcnJhbmdlKHRvcGljLCBkZXNjKGdhbW1hKSkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigib3JkZXIiKSAlPiUKICBtdXRhdGUob3JkZXIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihvcmRlcikpKSAlPiUKICBmdWxsX2pvaW4oZDFiX2FsbF9jb21wbGV0ZSAlPiUgCiAgICAgICAgICAgICAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JSAKICAgICAgICAgICAgICBzZWxlY3Qoc3ViaWQsIGFnZSwgY2hhcmFjdGVyKSkKCiMgZ2dwbG90KGQxYl9MREFfZG9jdW1lbnRzICU+JQojICAgICAgICAgIGZ1bGxfam9pbihkMWJfTERBX2RvY29yZGVyICU+JSBzZWxlY3Qoc3ViaWQsIG9yZGVyKSksCiMgICAgICAgIGFlcyh4ID0gdG9waWMsIHkgPSByZW9yZGVyKHN1YmlkLCBkZXNjKG9yZGVyKSksIGZpbGwgPSBnYW1tYSkpICsKIyAgIGdlb21fdGlsZSgpICsKIyAgIHNjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGUgPSAiUmRZbEJ1IiwgCiMgICAgICAgICAgICAgICAgICAgICAgICBndWlkZSA9IGd1aWRlX2NvbG9yYmFyKHRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxMCkpICsKIyAgIHRoZW1lX21pbmltYWwoKQoKZ2dwbG90KGQxYl9MREFfZG9jdW1lbnRzICU+JSAKICAgICAgICAgZnVsbF9qb2luKGQxYl9MREFfZG9jb3JkZXIpICU+JSAKICAgICAgICAgZmlsdGVyKCFpcy5uYShjaGFyYWN0ZXIpLCAhaXMubmEodG9waWMpKSAlPiUKICAgICAgICAgZGlzdGluY3QoKSwKICAgICAgIGFlcyh4ID0gYWdlLCB5ID0gZ2FtbWEsIGNvbG9yID0gZmFjdG9yKHRvcGljKSkpICsKICAjIGZhY2V0X3dyYXAofiB0b3BpYykgKwogIGZhY2V0X2dyaWQoY2hhcmFjdGVyIH4gdG9waWMpICsKICBnZW9tX3BvaW50KCkgKwogICMgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikgKwogIHRoZW1lX2J3KCkKYGBgCgoKCiMjIDQtMTB5bwoKYGBge3J9CiMgbWFrZSBMREEtZnJpZW5kbHkgZGYKZF9zbGlkZV9MREEgPC0gZF9zbGlkZV9hbGxfY29tcGxldGUgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJzdWJpZCIpICU+JQogIHNlbGVjdCgtYWdlLCAtY2hhcmFjdGVyKSAlPiUKICBnYXRoZXIoY2FwYWNpdHksIHJlc3BvbnNlLCAtc3ViaWQpICU+JQogIG11dGF0ZShyZXNwb25zZSA9IGlmZWxzZShyZXNwb25zZSA+IDAsIDEsIHJlc3BvbnNlKSkgIyBsZWdpdD8KICAjIG11dGF0ZShyZXNwb25zZSA9IChyZXNwb25zZSAqIDIpKSAjIGlzIHRoaXMgbGVnaXQ/IG5vdCBjb3VudHMuLi4KCmRfc2xpZGVfTERBX2tlZXAgPC0gZF9zbGlkZV9MREEgJT4lCiAgdW5ncm91cCgpICU+JQogIGdyb3VwX2J5KHN1YmlkKSAlPiUKICBzdW1tYXJpc2Uoc3VtID0gc3VtKHJlc3BvbnNlLCBuYS5ybSA9IFQpKSAlPiUKICBmaWx0ZXIoc3VtICE9IDApICU+JQogIG11dGF0ZShzdWJpZCA9IGFzLmNoYXJhY3RlcihzdWJpZCkpCiAgCmRfc2xpZGVfTERBIDwtIGRfc2xpZGVfTERBICU+JQogIGZpbHRlcihzdWJpZCAlaW4lIGRfc2xpZGVfTERBX2tlZXAkc3ViaWQpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBzcHJlYWQoY2FwYWNpdHksIHJlc3BvbnNlKSAlPiUKICByZW1vdmVfcm93bmFtZXMoKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInN1YmlkIikKCiMgZG8gTERBCmRfc2xpZGVfTERBIDwtIExEQSh4ID0gZF9zbGlkZV9MREEsIGsgPSAzKQpgYGAKCmBgYHtyfQojIGxvb2sgYXQgdGVybXMgYnkgdG9waWMKZF9zbGlkZV9MREFfdG9waWNzIDwtIHRpZHkoZF9zbGlkZV9MREEsIG1hdHJpeCA9ICJiZXRhIikKCmRfc2xpZGVfTERBX3Rlcm1vcmRlciA8LSBkX3NsaWRlX0xEQV90b3BpY3MgJT4lCiAgZ3JvdXBfYnkodGVybSkgJT4lCiAgdG9wX24oMSwgYmV0YSkgJT4lCiAgYXJyYW5nZSh0b3BpYywgZGVzYyhiZXRhKSkgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigib3JkZXIiKSAlPiUKICBtdXRhdGUob3JkZXIgPSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihvcmRlcikpKQoKZ2dwbG90KGRfc2xpZGVfTERBX3RvcGljcyAlPiUKICAgICAgICAgZnVsbF9qb2luKGRfc2xpZGVfTERBX3Rlcm1vcmRlciAlPiUgc2VsZWN0KHRlcm0sIG9yZGVyKSkgJT4lCiAgICAgICAgIGRpc3RpbmN0KCksCiAgICAgICBhZXMoeCA9IHRvcGljLCB5ID0gcmVvcmRlcih0ZXJtLCBkZXNjKG9yZGVyKSksIGZpbGwgPSBiZXRhKSkgKwogIGdlb21fdGlsZSgpICsKICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIllsR24iLCBkaXJlY3Rpb24gPSAxLAogICAgICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfY29sb3JiYXIodGl0bGUgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJoZWlnaHQgPSAxMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gMToxMCkgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA0LCBmaWcuaGVpZ2h0ID0gNn0KIyBsb29rIGF0IHRvcGljcyBieSAiZG9jdW1lbnQiIChwYXJ0aWNpcGFudCkKZF9zbGlkZV9MREFfZG9jdW1lbnRzIDwtIHRpZHkoZF9zbGlkZV9MREEsIG1hdHJpeCA9ICJnYW1tYSIpICU+JQogIHJlbmFtZShzdWJpZCA9IGRvY3VtZW50KQoKZF9zbGlkZV9MREFfZG9jb3JkZXIgPC0gZF9zbGlkZV9MREFfZG9jdW1lbnRzICU+JQogIGdyb3VwX2J5KHN1YmlkKSAlPiUKICB0b3BfbigxLCBnYW1tYSkgJT4lCiAgYXJyYW5nZSh0b3BpYywgZGVzYyhnYW1tYSkpICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oIm9yZGVyIikgJT4lCiAgbXV0YXRlKG9yZGVyID0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIob3JkZXIpKSkgJT4lCiAgZnVsbF9qb2luKGRfc2xpZGVfYWxsX2NvbXBsZXRlICU+JSAKICAgICAgICAgICAgICByb3duYW1lc190b19jb2x1bW4oInN1YmlkIikgJT4lIAogICAgICAgICAgICAgIHNlbGVjdChzdWJpZCwgYWdlLCBjaGFyYWN0ZXIpKQoKIyBnZ3Bsb3QoZF9zbGlkZV9MREFfZG9jdW1lbnRzICU+JQojICAgICAgICAgIGZ1bGxfam9pbihkX3NsaWRlX0xEQV9kb2NvcmRlciAlPiUgc2VsZWN0KHN1YmlkLCBvcmRlcikpLAojICAgICAgICBhZXMoeCA9IHRvcGljLCB5ID0gcmVvcmRlcihzdWJpZCwgZGVzYyhvcmRlcikpLCBmaWxsID0gZ2FtbWEpKSArCiMgICBnZW9tX3RpbGUoKSArCiMgICBzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlID0gIlJkWWxCdSIsIAojICAgICAgICAgICAgICAgICAgICAgICAgZ3VpZGUgPSBndWlkZV9jb2xvcmJhcih0aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFyaGVpZ2h0ID0gMTApKSArCiMgICB0aGVtZV9taW5pbWFsKCkKCmdncGxvdChkX3NsaWRlX0xEQV9kb2N1bWVudHMgJT4lIAogICAgICAgICBmdWxsX2pvaW4oZF9zbGlkZV9MREFfZG9jb3JkZXIgJT4lIHNlbGVjdChzdWJpZCwgY2hhcmFjdGVyLCBhZ2UpKSAlPiUgCiAgICAgICAgIGZpbHRlcighaXMubmEoY2hhcmFjdGVyKSwgIWlzLm5hKHRvcGljKSkgJT4lCiAgICAgICAgIGRpc3RpbmN0KCksCiAgICAgICBhZXMoeCA9IGFnZSwgeSA9IGdhbW1hLCAKICAgICAgICAgICAjIGNvbG9yID0gY2hhcmFjdGVyLCBmaWxsID0gY2hhcmFjdGVyKSkgKwogICAgICAgICAgIGNvbG9yID0gZmFjdG9yKHRvcGljKSwgZmlsbCA9IGZhY3Rvcih0b3BpYykpKSArCiAgIyBmYWNldF9ncmlkKH4gdG9waWMpICsKICBmYWNldF9ncmlkKGNoYXJhY3RlciB+IHRvcGljKSArCiAgZ2VvbV9wb2ludCgpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSArCiAgdGhlbWVfYncoKQpgYGAKCmBgYHtyfQpsaWJyYXJ5KHBsb3RseSkKcGxvdF9seShkX3NsaWRlX0xEQV9kb2N1bWVudHMgJT4lCiAgICAgICAgICBtdXRhdGUodG9waWMgPSByZWNvZGUodG9waWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEiID0gInRvcGljXzEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyIiA9ICJ0b3BpY18yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMyIgPSAidG9waWNfMyIpKSAlPiUKICAgICAgICAgIHNwcmVhZCh0b3BpYywgZ2FtbWEpICU+JQogICAgICAgICAgZnVsbF9qb2luKGRfc2xpZGVfTERBX2RvY29yZGVyICU+JSAKICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChzdWJpZCwgYWdlLCBjaGFyYWN0ZXIpKSAlPiUKICAgICAgICAgIGZpbHRlcighaXMubmEoY2hhcmFjdGVyKSksCiAgICAgICAgeCA9IH50b3BpY18xLCB5ID0gfnRvcGljXzIsIHogPSB+dG9waWNfMywKICAgICAgICBjb2xvciA9IH5hZ2UsCiAgICAgICAgIyBjb2xvciA9IH5jaGFyYWN0ZXIsCiAgICAgICAgIyBzaXplID0gfmFnZSwKICAgICAgICBvcGFjaXR5ID0gMC42KQpgYGAKCg==